package controller

import (
	"gitee.com/jiebaiyou/formflow/bootstrap"
	"gitee.com/jiebaiyou/formflow/model"
	"gitee.com/jiebaiyou/formflow/pkg/bizcode"
	"gitee.com/jiebaiyou/formflow/pkg/response"
	"github.com/gin-gonic/gin"
	"golang.org/x/crypto/bcrypt"
)

// LoginController 处理用户登录相关的HTTP请求
// 它依赖于LoginService接口来实现业务逻辑, 并使用环境配置来生成令牌
type LoginController struct {
	LoginService model.LoginService // 用户登录业务逻辑接口
	Env          *bootstrap.Config  // 环境配置, 包含令牌密钥和过期时间等信息
}

// Login 处理用户登录请求
func (lc *LoginController) Login(c *gin.Context) {
	var request model.LoginRequest

	// 解析请求体并绑定到LoginRequest结构体
	err := c.ShouldBind(&request)
	if err != nil {
		// 如果请求格式不正确, 返回400错误
		response.BadRequest(c, bizcode.InvalidParams.String(), err)
		return
	}

	// 根据提供的邮箱查找用户
	user, err := lc.LoginService.GetUserByEmail(c, request.Email)
	if err != nil {
		// 如果用户不存在, 提示用户名/密码不正确, 避免暴露用户名是否存在
		response.NotFound(c, bizcode.UsernameOrPasswordIncorrect.String(), nil)
		return
	}

	// 验证密码是否匹配
	if bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(request.Password)) != nil {
		// 如果密码不匹配, 提示用户名/密码不正确, 避免暴露密码是否正确
		response.Unauthorized(c, bizcode.UsernameOrPasswordIncorrect.String(), nil)
		return
	}

	// 创建访问令牌(access token)
	accessToken, err := lc.LoginService.CreateAccessToken(&user, lc.Env.JWT.ACCESS_TOKEN_SECRET, lc.Env.JWT.ACCESS_TOKEN_EXPIRY_HOUR)
	if err != nil {
		// 如果创建令牌失败, 返回500服务器内部错误
		response.ServerError(c, bizcode.CreateAccessTokenFailed.String(), err)
		return
	}

	// 创建刷新令牌(refresh token)
	refreshToken, err := lc.LoginService.CreateRefreshToken(&user, lc.Env.JWT.REFRESH_TOKEN_SECRET, lc.Env.JWT.REFRESH_TOKEN_EXPIRY_HOUR)
	if err != nil {
		// 如果创建刷新令牌失败, 返回500服务器内部错误
		response.ServerError(c, bizcode.CreateRefreshTokenFailed.String(), err)
		return
	}

	// 构建登录响应, 包含两个令牌
	loginResponse := model.LoginResponse{
		AccessToken:  accessToken,
		RefreshToken: refreshToken,
	}

	// 返回成功响应和令牌
	response.OK(c, bizcode.Success.String(), loginResponse)
}
